﻿#ifndef LAMPCONTROL_H
#define LAMPCONTROL_H

#include <QObject>

namespace Qly {
/// TODO： 光源亮度值应保存在文件中。
/// TODO: 不同的实验用的亮度值不同，应该有所区别。可以分别保存。

/**
 * @brief The LampControl class 光源控制的接口类。支持多通道光源。
 *      对于显微镜应用来说，由于有物镜切换，切换物镜时，图像亮度会发生变化。所以有各种策略。
 *      本接口并不实现具体的策略。应用程序使用什么策略由应用程序自己确定。
 *      一些常见策略：
 *         （1）根据物镜的数值孔径，计算光源亮度的调整量。
 *         （2）记录每个物镜时用户设置的亮度，当用户切换物镜时将亮度切换为用户之前设置的值。
 *             如果切换到一个没有设置过亮度的物镜（也就是目标亮度是初始值 0），那么将当前光源的亮度传递给目录亮度。作为目标亮度的初始值。
 */
class LampControl : public QObject
{
    Q_OBJECT
public:
    explicit LampControl(uint8_t channelCount, QObject *parent = nullptr);

    /**
     * @brief brightness 获得灯的当前亮度
     * @return
     */
    virtual bool value(uint8_t ch, int &value) = 0;
public slots:

    /**
     * @brief setTracking 是否记录每个物镜的亮度
     * @param on
     */
    bool setTracking(uint8_t ch, bool on) {m_tracking[ch] = on; return true;}

    /**
     * @brief setBrightness 设置灯的亮度
     * @param value
     */
    virtual bool setValue(uint8_t ch, int value) = 0;

    /**
     * @brief turnOnOff 开关光源
     * @param on
     */
    virtual bool turnOn(uint8_t ch) = 0;
    virtual bool turnOff(uint8_t ch) = 0;

    virtual void onLensChanged(int oldlens, int newlens) = 0;

protected:
    int m_count = 1;
    QVector<bool> m_tracking; // 最多支持 255 通道的光源
    QVector<bool> m_enable;
    int m_lens = 0;
};
}


#endif // LAMPCONTROL_H
